import java.util.Set;

//E是用户指定的类型
public class SeqList<E> implements List<E> {
    public E []data;
    public int _size;

    //初始化顺序表
    public SeqList() {
        data = (E[]) new Object[10];
        _size = 0;
    }
    //由a数组建立线性表的相应存储结构，相当于初始化列表
    public void createList(E[] a) {
        for(int i =0;i<a.length;i++) {
            if(data.length==_size){
                updatacapacity(_size*2);
            }
            data[i] = a[i];
            _size++;
        }
    }
    //获得顺序表内元素的个数
    public int getSize() {
        return _size;
    }
    //设置新的元素个数，注意新元素个数不能比老元素个数大或者小于0
    public void setSize(int nlen){
        if(nlen<0||nlen>_size){
            throw new IllegalArgumentException("新Size有误");
        }
        _size = nlen;
    }
    //获得序号为i的元素
    public E getElem(int i) {
        if(i<0||i>=_size){
            throw new IllegalArgumentException("序号"+i+"不存在");
        }
        return data[i];
    }
    //将序号i设为元素e
    public void setElem(int i,E e){
        if(i<0||i>=_size){
            throw new IllegalArgumentException("序号"+i+"不存在");
        }
        else {
            data[i] = e;
        }
    }
    //获得元素e的序号，若未查找到则返回-1
    public int getNo(E e) {
        for(int i =0;i<_size;i++){
            if(data[i].equals(e)){
                return i;
            }
        }
        return -1;
    }
    //交换
    void swap(int i,int j){
        E t = data[i];
        data[i] = data[j];
        data[j] = t;
    }
    //在顺序表末尾添加一个新元素e
    //这里我复用了insert方法，由于尾插同等于在序号为_size下插入一个新元素，所以选择复用，减少代码量
    public void add(E e){
        insert(_size,e);
    }
    //在序号为i的位置插入一个新元素e
    public void insert(int i,E e){
        if(i<0||i>_size){
            throw new IllegalArgumentException("序号"+i+"不存在");
        }
        if(data.length==_size){
            updatacapacity(_size*2);
        }
        for(int pos = _size;pos>i;pos--){
            data[pos] = data[pos-1];
        }
        data[i] =e;
        _size++;
    }
    //删除序号为i的元素
    public void delete(int i ){
        if(i<0||i>=_size){
            throw new IllegalArgumentException("序号"+i+"不存在");
        }
        for(int pos = i;pos<_size-1;pos++) {
            data[pos] = data[pos+1];
        }
        _size--;

        if(data.length>=10&&_size==data.length/4){
            updatacapacity(data.length/4);
        }
    }

    public String toString(){
        String ret = "";
        for(int i =0;i<_size;i++) {
            ret = ret + data[i]+" ";
        }
        return ret;
    }
    //扩容方法
    public void updatacapacity(int newcapacity){
        E[] newdata = (E[]) new Object[newcapacity];
        for(int i =0;i<_size;i++){
            newdata[i] = data[i];
        }
        data = newdata;
    }
}
